8.2 简单的TCP示例
TCP
在我们的实际开发中也是必不可少的东西,我们的大部分业务都需要使用TCP
实现。
比如聊天软件、聊天室等,在Go
语言中使用TCP也比较简单,我们接下来直接以代码示例进行说明。
示例主要分为两方面,一个是客户端,一个是服务端。
本节代码存放目录为 lesson24
- 服务端
server.go
func handleConnection(conn net.Conn) {
defer conn.Close()
fmt.Printf("handleConnection, remote-> %s\n", conn.RemoteAddr().String())
for {
data, err := bufio.NewReader(conn).ReadString('\n')
if err != nil {
if err == io.EOF {
fmt.Printf("断开连接\n")
break
}
fmt.Printf("err-> %v", err)
}
fmt.Printf("接收数据: %s", data)
}
}
func main() {
l, err := net.Listen("tcp", "127.0.0.0:8088")
if err != nil {
fmt.Printf("err-> %v\n", err)
return
}
defer l.Close()
for {
conn, err := l.Accept()
if err != nil {
fmt.Printf("err-> %v", err)
continue
}
go handleConnection(conn)
}
}
在上面的代码中,我们首先通过net.Listen
创建了TCP
服务器,之后我们通过for
一直不断的监听来自客户端的连接。
当有新的客户端进行连接时,我们开启了一个协程handleConnection
来读取来自客户端的连接。
- 客户端
client.go
func main() {
conn, err := net.Dial("tcp", "127.0.0.1:8088")
if err != nil {
fmt.Printf("err-> %v\n", err)
return
}
defer conn.Close()
for {
data := fmt.Sprintf("%s\n", time.Now().Format("2006-01-02 15:04:05"))
fmt.Printf(data)
fmt.Fprintf(conn, data)
time.Sleep(time.Duration(1) * time.Second)
}
}
在客户端代码中,我们通过net.Dial
向TCP
服务器发起了连接,之后通过for
循环每隔一秒向服务器发送当前时间数据。
- 运行
首先我们需要将server.go
运行起来,之后运行client.go
。
server.go
运行输出如下:
handleConnection, remote-> 127.0.0.1:49192
接收数据: 2024-08-20 14:40:45
接收数据: 2024-08-20 14:40:46
接收数据: 2024-08-20 14:40:47
接收数据: 2024-08-20 14:40:48
client.go
运行输出如下:
2024-08-20 14:40:45
2024-08-20 14:40:46
2024-08-20 14:40:47
2024-08-20 14:40:48
TCP
是比较常用且复杂的东西,在实际使用的时候需要考虑的东西比较多。
例如客户端的连接如何管理、通信协议如何制定、如何保持连接等,这是一整套的内容,如果感兴趣的话可以看一下 plex ,这是一个基础的TCP
应用案例。